package com.candy.candyuser.model.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.candy.candycommon.utils.ResultBean;
import com.candy.candyuser.model.entity.User;
import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

/**
 * @author suYanLong
 * @date 2023年02月10日 15:55
 * 通过 @LocalTCC 这个注解，RM 初始化的时候会向 TC 注册一个分支事务。
 * TODO seata XA模式
 *  与AT模式使用几乎一样，只需要调整一下即可
 *  1、设置seata.data-source-proxy-mode=XA 默认AT
 *  2、undo_log表只有AT模式使用
 */
//@LocalTCC
public interface UserService extends IService<User> {

    ResultBean addUser();

    /**
     * try
     *
     * @return
     */
    @TwoPhaseBusinessAction(name = "addUserTcc", commitMethod = "addUserTccCommit", rollbackMethod = "addUserTccRollback", useTCCFence = true)
    ResultBean addUserTcc();

    /**
     * commit
     *
     * @param businessActionContext
     * @return
     */
    Boolean addUserTccCommit(BusinessActionContext businessActionContext);

    /**
     * cancel
     *
     * @param businessActionContext
     * @return
     */
    Boolean addUserTccRollback(BusinessActionContext businessActionContext);

}
